SQL OVER() Partition By Order By

--Partition by 作用是分组,没有进行聚合,返回多条记录。 order by 是排序
--写法         函数名 +over(partition by)别名
--写法         函数名 +over(order by)别名
--写法         函数名 +over(partition by 列名 order by 列名)别名
Declare @tbl1 table(
name nvarchar(20),
course nvarchar(20),
score int
)
insert into @tbl1 values ( 'Alen' , 'math' , 98),( 'Alen' , 'chinese' , 95),( 'Alen' , 'english' , 76),( 'Tom' , 'math' , 85),
( 'Tom' , 'chinese' , 98),( 'Tom' , 'english' , 69),( 'Jack' , 'math' , 93),( 'Jack' , 'chinese' , 90),( 'Jack' , 'english' , 89)

---------------------------------------------------------------------------------------

--以名称分组,求总分
select name,course,score,
SUM(score) over(partition by name) ranking  
from @tbl1

-------------------------------------------------------------------------------------

--不分组对分数进行排名    出现两个相同最高分,则排名结果为1,1,3
select name,course,score,
rank() over(order by score desc) ranking
from @tbl1
--不分组对分数进行排名    出现两个相同最高分,则排名结果为1,1,2
select name,course,score,
dense_rank() over(order by score desc) ranking
from @tbl1
--ROW_NUMBER()只是计数,当分数相等时,会出现排名不等。出现两个相同最高分,则排名结果为1,2,3
select name,course,score,
ROW_NUMBER() over(order by score desc) ranking
from @tbl1

--------------------------------------------------------------------------------------

--以名称分组,按成绩从高到低排序
select name,course,score,
ROW_NUMBER() over(partition by name order by score desc) ranking  
from @tbl1
--以课程分组,按成绩从高到低排序
select name,course,score,
ROW_NUMBER() over(partition by course order by score desc) ranking
from @tbl1

partition by 注意事项:

当使用partition by做分组后的排名时,将排名的过滤条件放到最外层。将其他的查询条件放到里层。如果将查询条件都放到外层,有可能会造成查询结果为空。

--已课程分组,查询分数在90分以上的各科最高分。
select * from 
(select name,course,score,
ROW_NUMBER() over(partition by course order by score desc) ranking from @tbl1
where score>90--此查询条件需要在内层
) A 
WHERE A.ranking=1 --排名作为最外层的查询条件

 

  • 2
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值